The present disclosure relates generally to initialization, and more specifically, to an improved initialization safety in Java.
Concurrent threads or processes might not have visibility with respect to a latest value assigned to, or associated with, a field. For example, a compiler and a central processing unit (CPU) adhering to the Java Language Specification (JLS) might reorder instructions and their executions. A reordering of instructions might not guarantee that the latest value would be visible.
An approach to ensuring visibility of a field of a new object at the completion of a constructor is a memory fence. As an example, a so-called “final” attribute may be associated with a shared field. However, a field designated as final cannot be modified. To effectively achieve modification of the value, a new object would need to be created to replace the initial object/field designated as final. The creation of the new object results in a penalty in terms of overhead due to garbage collection of the initial object/field. As another example, a so-called “volatile” attribute may be associated with a shared field. However, use of a volatile field results in a penalty in terms of the reading of the volatile field, which is required to adhere to the JLS.